#include "Log.h"
////////////////////// Konfiguracia logu
////////////////////// 

// Pre logovanie je potrebne pridat tzv. appendre, ktore su schopne zapisovat 
// do roznych cielov. Appender musi byt odvodeny od triedy jmlib::LogApender 
// a implementovat pozadovane rozhranie.
// Pre registraciu je potrebne zvolit meno, ktore je mozne pouzit ako platny 
// identifikator tj. bez :: takze je vhodne pouzit premenovanie napr.
// typedef jmlib::StdCoutLogAppender jmlib_StdCoutLogAppender;
// Appendrov moze byt lubovolne vela. Pridanie appendru moze byt skoro lubovolne 
// v kode: mimo triedy, v triede, v metode ci funckii je vsak potrebne si 
// uvedomit, ze pokial neprebehne kod pridania appenderu tak logovane spravy nezapise.
// Opakovane pridavanie appenderu nevadi avsak ma vplyv na vykon aplikacie.
// Odporucam zadavat registraciu mimo tried tak ako je uvedene dalej.
// Druhym parametrom je formatovaci retazec vystupnej spravy.
// Dostupne formatovacie znacky su:
// %l line number
// %f function name
// %i logger id/name
// %m log message
// %x log level
// %t log time
// %a logger address
// 
typedef jmlib::StdCoutLogAppender MyConsoleAppender;
typedef jmlib::StdCerrLogAppender MyErrorAppender;
JM_ADD_LOG_APPENDER(MyConsoleAppender, "%m", "")
JM_ADD_LOG_APPENDER(MyErrorAppender, "%l\t%n\t%m", "")

// Pre supstenie logovania je potrebne aktivovat logger.
// Neaktivne loggery neloguju -> vhodna filtracia pre ladenia a pod.
// Aktivny logger neprebera scope neaktivneho. Vid dalej 
// implicitny_globalny_logger nepreberie spravy pre implicitny_logger_triedy_X
// proste sa nezaloguju ak nie je aktivny.
JM_SET_LOGGER_ACTIVE(implicitny_globalny_logger, JM_ALL)
// Aktivovat logger je mozne skupinovo pomocou prefixu.
JM_SET_LOGGER_ACTIVE_BY_PREFIX(explicitny, jmlib_StdCoutLogAppender)

////////////////////////////////////// Zapis do logu
////////////////////////////////////// 

// implicitny logger moze byt iba v jednom rozsahu viditelnosti len jeden
JM_USE_LOGGER(implicitny_globalny_logger)
// explicitnych loggerov moze byt lubovolne vela
JM_USE_EXPLICIT_LOGGER(explicitny_globalny_logger_1)
JM_USE_EXPLICIT_LOGGER(explicitny_globalny_logger_2)

class X {
	JM_USE_LOGGER(implicitny_logger_triedy_X)
	JM_USE_EXPLICIT_LOGGER(explicitny_globalny_logger_triedy_X)

	void xxx() {
		JM_LOG_DEBUG("Toto bude logovat implicitny_logger_triedy_X")
		// na implicitny_globalny_logger sa v tomto kontexte nie je mozne dostat

		JM_LOG_TRACE_EXPLICIT(explicitny_logger_triedy_X,
		"Explicitne loggery je mozne volat podla mena.")

		JM_LOG_TRACE_EXPLICIT(explicitny_globalny_logger_2,
		"Explicitne loggery je mozne volat podla mena aj z nadradenych scope")
	}
};

class Y {
	void yyy() {
		JM_LOG_DEBUG("Toto bude logovat implicitny_globalny_logger. "
			<< "Tu nie je nicim prkryty ako v triede X.")
		
		LOG_T_EX(explicitny_globalny_logger_2,
		"Skratena forma volania logovania v levele TRACE. " << 
		"Explicitne loggery je mozne volat podla mena aj z nadradenych scope.")
	}
};


void fun() {
	JM_USE_LOGGER(implicitny_logger_funkcie)
	// explicitnych loggerov moze byt lubovolne vela
	JM_USE_EXPLICIT_LOGGER(explicitny_logger_funkcie)


	LOG_D("Sparava sa zaloguje implicitnym loggerom funkcie." << 
	"Skratene volanie makre JM_LOG_DEBUG")
	LOG_D_EX(explicitny_logger_funkcie, 
	"Obdone ako predtym ale volanie explicitneho loggeru.")

	LOG_D_EX(explicitny_globalny_logger, 
	"Obdone ako predtym je mozne pouzitie loggeru z nadradenych rozsahov.")
}

